package searchlight;

import java.util.Random;

import com.sun.squawk.util.Arrays;

public class ProbingScheme {

    private final int[] probingPattern;

    private final boolean[] schedule;

    private int probeSlotIndex;

    public ProbingScheme(int periodSize, String scheme) {
        schedule = new boolean[periodSize];

        probingPattern = new int[periodSize / 2];
        if ("sequential".equals(scheme)) {
            for (int i = 0; i < probingPattern.length; i++) {
                probingPattern[i] = i + 1;
            }
        } else if ("randomized".equals(scheme)) {
            int[] possibleValues = new int[probingPattern.length];
            for (int i = 0; i < possibleValues.length; i++) {
                possibleValues[i] = i + 1;
            }

            final Random random = new Random();
            for (int i = 0; i < probingPattern.length; i++) {
                int index = random.nextInt(possibleValues.length);
                probingPattern[i] = possibleValues[index];
                
                int temp = possibleValues[0];
                possibleValues[0] = possibleValues[index];
                possibleValues[index] = temp;
                
                possibleValues = Arrays.copy(possibleValues, 1, possibleValues.length - 1, 0, possibleValues.length - 1);
            }
        } else {
            throw new RuntimeException("Invalid scheme");
        }

        probeSlotIndex = 0;
    }

    public boolean[] getNextPeriod() {
        final boolean[] nextPeriod = new boolean[schedule.length];

        nextPeriod[0] = true;
        nextPeriod[probingPattern[probeSlotIndex]] = true;

        if (probeSlotIndex < probingPattern.length - 1) {
            probeSlotIndex++;
        } else {
            probeSlotIndex = 0;
        }

        return nextPeriod;
    }

    // public static void main(String[] arg) {
    // final ProbingScheme scheme = new ProbingScheme(8, "randomized");
    //
    // for (int i = 0; i < 100; i++) {
    // System.out.print(i + ":");
    // for (boolean isActive : scheme.getNextPeriod()) {
    // System.out.print(isActive ? "A" : "=");
    // }
    // System.out.println();
    // }
    // }
}
